package com.tedu.api.list;

import org.junit.Test;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Random;

/**
 *Collection 顶级集合容器
 * List集合【接口】继承与Collection【接口】
 * LIst集合：存储重复并且有序的元素
 * 注意：List集合类似数组，有些方法与数组使用一致
 * List集合【接口】
 * java.util.ArrayList：数组实现【常用】
 * java.util.LinkedList ：链表实现
 * 以上两个类使用方法完全一致
 *
 */
public class ListAPI {
    /** List接口--提供get方法，可以被ArrayList类重写
     * get（int index）    返回值：e
     * 作用：根据下标获取集合元素
     */
    @Test
    public void testGet(){
        //多态方式：父类引用指向子类对象【常用:调父、子类方法相同：重写】
        //重写调用子类方法
       // List<String> list=new ArrayList<>();
       // list.get(0);//重写调用子类的get方法
        //直接创建实现类对象:调用ArrayList方法
       // ArrayList<String> al=new ArrayList<>();
       // al.get(0);
        List<String> list=new ArrayList<>();
        list.add("西游记");
        list.add("水浒传");
        list.add("红楼梦");
        System.out.println("打印List集合："+list);
        //获取下标
        String index=list.get(1);
        System.out.println("取出集合元素："+index);
        //遍历集合内容--普通for
        for(int i=0;i<list.size();i++){   //i  下标  0   1   2
            index=list.get(i);
            System.out.println("获取集合全部元素："+index);

        }
    }
    /**
     * List接口下方法
     * 添加、替换、移除
     * add（int index ，E e）方法      返回值：void    重载方法
     * 作用：将给定元素插入到指定位置
     * set（int index.E e）方法       返回值：E
     * 作用：将给定元素设置到指定的位置
     * remove（）方法
     *
     */
    @Test
    public void testASR(){
        List<String> list=new ArrayList<>();
        list.add("one");list.add("two");list.add("three");
        //需求：在集合 two元素前添加”2“
        list.add(1,"2");
        System.out.println("插入元素的集合："+list);
        //需求：删除集合中”二“的元素
        list.remove("二");//Collection 接口remove，通过元素
        list.remove(1);
        System.out.println("删除集合元素："+list);

    }
    /**
     * List 提供可以获取子集的方法   返回值：list<E>【Object对象】
     * subList(int start,int end)  口诀：含头不含尾
     * 作用：截取集合中范围内的子集
     */
    @Test
    public void testSubList(){
        //创建集合，指定类型Integer
        List<Integer> list=new ArrayList<>();
        //需求：添加10个元素，元素数：0-9数值
        for(int i=0;i<10;i++){//所有集合重写父级的方法
            list.add(i);//add();添加--重写：Collection-add的方法
        }
        //打印集合
        System.out.println("添加元素后的集合："+list);
        //需求：需要获取子集、范围：3-8的元素,分页操作：获取子集合
        List<Integer> list1=list.subList(3,9);
        //打印子集合
        System.out.println("获取子集："+list1);
        System.out.println("打印集合："+list);
        //练习：截取list2-7的元素，子集扩大10倍，提醒：set方法
        List<Integer> list2=list.subList(2,8);
        for(int i=0;i<list2.size();i++){
            //获取子集下标
            //设置子集扩大10倍
            list2.set(i,list2.get(i)*10);
            //set(i:0-4     下标
            //    list2.get(0-4):获取对应元素*10)
        }
        System.out.println("输出list2子集集合元素："+list2);
        //练习2：删除List集合元素中：1-7的元素   提醒：子集、消除
        List<Integer> listRem=list.subList(1,8);
        listRem.clear();
        System.out.println("删除list【2-7】元素，最终集合："+list);
        //总结：获取子集，打印子集没有操作
        //     消控子集，原来集合移除部分子类

    }
    /**
     * 数组转集合操作
     * Arrays工具类：提供静态方法asList(数组引用)
     *              asList（数组引用）；将数组转换为集合
     *  注意：
     */
    @Test
    public void testArrays(){
        //创建字符串静态数组
        String[] array={"十一","元旦","寒假"};
        //将数组转换为集合     --------软件更新
        List<String> list=Arrays.asList(array);
        //需求：将List集合中”元旦“改成”除夕“
        list.set(1,"除夕");   //set方法是list接口方法
        System.out.println("数组转集合："+list);
        //需求：增强for，数组添加元素【add方法  add（“节日”）】
        for(String str:array){
            /**
             *  UnsupportedOperationException
             * 不支持操作异常
             * 因为遍历数组，进行集合操作，不支持操作异常
             * /
             // list.add("节日");
             }
        /**
             * List构造器使用：传入有参构造器【类型：其他集合，功能：addAll】
             *  创建集合 List<String> list=new ArraysList<>(集合引用)
             *
         */
       List<String> lists=new ArrayList<>();
            //集合构造器参数：集合引用---lists集合元素添加至listes集合中
            // 替代：addAll方法，   操作：并集
            List<String> listes=new ArrayList<>(lists);
        }
    }

    /**
     * 集合排序
     * Collections 工具类
     * 静态方法：sort（） 排序【默认：升序】--实现List接口排序功能
     *
     * java.util.Random伪随机数类
     * nextInt(数值) 功能：返回一个数值内伪随机数
     * 导入包问题，通用导入包方式      通配符 * 匹配所有
     *           如果类存在于util工具包下，例如：import java.util.*
     *           类最上方：import java.util.Random
     *                    import java.util.List
     *                    import java.util.ArrayList
     * 需求：创建集合随机生成10个元素【100以内伪随机数】
     */
    @Test
    public void testRandom(){
        List<Integer> list=new ArrayList<>();
        //创建随机数对象
        Random random=new Random();
        //给List集合添加10个元素【100以内随机数】
        for(int i=0;i<10;i++){
            list.add(random.nextInt(100));//100以内随机数
        }
        System.out.println("list集合："+list);
    }
    /**
     * 集合排序
     * Collections工具类
     *
     * 面试题：Collection和
     * 静态方法sort（集合引用，比较器引用）功能：按照比较器约定规则排序
     * Coparator比较器
     * 需求：集合村汉字--按照要求排序【比较器】
     */
    /**
     * 总结：List集合
     *  list接口集合  是Collection容器接口    的子接口
     *  list子接口---无法实例化---实现类：Arraylist、linkedlist、
     *  使用情况：保存一组数据，有序情况，采用list集合
     *  list子接口方法就是ArrayList的方法！因为ArrayList重写List所有方法
     */
    @Test
    public void testArrayList(){
        //下述方式创建对象：
        // 【常用方式：父子级对象的方法
        // 多态:方法一致，调用父类的方法--执行父类功能
        //              调用子类的方法--与父类方法名参数完全一致，执行子类的重写】

        List<String> list=new ArrayList<>();
        list.add("张三");list.add("李四");list.add("王五");
        //由list【ArrayList】保存集合，内存创建状态

       // List<String> list=new ArrayList<>();
        //调取几个方法
        //list.add("张三");  list.set(0,"王五");
        //下述方式创建对象：只调用ArrayList的方法
        //ArrayList<String> arrayList=new ArrayList<>();
        //arrayList.add("李四");arrayList.set(0,"赵六");

    }
}
